win32: Send window-state-changes before configure events
authorAlexander Larsson <alexl@redhat.com>
Wed, 26 Oct 2011 08:21:10 +0000 (10:21 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 10 Nov 2011 16:41:01 +0000 (17:41 +0100)
This is requires to that the state of the window is right when
you get the configure event (and to match what X does).

Fixes bug #169811

gdk/win32/gdkevents-win32.c
gdk/win32/gdkwindow-win32.c

index 47e248f13f426468952b2c311a564fb55341b725..b99c03d992b820e4a36e9f2aa8e319e6b35af538 100644 (file)
@@ -2738,36 +2738,6 @@ gdk_event_translate (MSG  *msg,
          _gdk_win32_append_event (event);
        }
 
-      /* Show, New size or position => configure event */
-      if (!(windowpos->flags & SWP_NOCLIENTMOVE) ||
-         !(windowpos->flags & SWP_NOCLIENTSIZE) ||
-         (windowpos->flags & SWP_SHOWWINDOW))
-       {
-         if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
-             !IsIconic (msg->hwnd) &&
-             !GDK_WINDOW_DESTROYED (window))
-           handle_configure_event (msg, window);
-
-         if (window->extension_events != 0)
-           _gdk_device_wintab_update_window_coords (window);
-       }
-
-      if ((windowpos->flags & SWP_HIDEWINDOW) &&
-         !GDK_WINDOW_DESTROYED (window))
-       {
-         /* Send UNMAP events  */
-         event = gdk_event_new (GDK_UNMAP);
-         event->any.window = window;
-         _gdk_win32_append_event (event);
-
-         /* Make transient parent the forground window when window unmaps */
-         impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
-
-         if (impl->transient_owner && 
-             GetForegroundWindow () == GDK_WINDOW_HWND (window))
-           SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner));
-       }
-
       /* Update window state */
       if (windowpos->flags & (SWP_STATECHANGED | SWP_SHOWWINDOW | SWP_HIDEWINDOW))
        {
@@ -2813,6 +2783,36 @@ gdk_event_translate (MSG  *msg,
            ensure_stacking_on_unminimize (msg);
        }
 
+      /* Show, New size or position => configure event */
+      if (!(windowpos->flags & SWP_NOCLIENTMOVE) ||
+         !(windowpos->flags & SWP_NOCLIENTSIZE) ||
+         (windowpos->flags & SWP_SHOWWINDOW))
+       {
+         if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
+             !IsIconic (msg->hwnd) &&
+             !GDK_WINDOW_DESTROYED (window))
+           handle_configure_event (msg, window);
+
+         if (window->extension_events != 0)
+           _gdk_device_wintab_update_window_coords (window);
+       }
+
+      if ((windowpos->flags & SWP_HIDEWINDOW) &&
+         !GDK_WINDOW_DESTROYED (window))
+       {
+         /* Send UNMAP events  */
+         event = gdk_event_new (GDK_UNMAP);
+         event->any.window = window;
+         _gdk_win32_append_event (event);
+
+         /* Make transient parent the forground window when window unmaps */
+         impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
+
+         if (impl->transient_owner &&
+             GetForegroundWindow () == GDK_WINDOW_HWND (window))
+           SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner));
+       }
+
       if (!(windowpos->flags & SWP_NOCLIENTSIZE))
        {
          if (window->resize_count > 1)
index b08d74b570beb8b254d21ce7731ac7a98acc6f2c..d1b2c8f1c78a438fea3dbf2a932a30ad01c6bd31 100644 (file)
@@ -2720,14 +2720,15 @@ gdk_win32_window_fullscreen (GdkWindow *window)
       g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
       fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
 
+      /* Send state change before configure event */
+      gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
+
       SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, 
                      (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
 
       API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_TOP,
                               x, y, width, height,
                               SWP_NOCOPYBITS | SWP_SHOWWINDOW));
-
-      gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
     }
 }
 
@@ -2743,6 +2744,8 @@ gdk_win32_window_unfullscreen (GdkWindow *window)
     {
       GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
 
+      gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
+
       impl->hint_flags = fi->hint_flags;
       SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
       API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
@@ -2753,7 +2756,6 @@ gdk_win32_window_unfullscreen (GdkWindow *window)
       g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
       g_free (fi);
 
-      gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
     }
 }